﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class TipoPagamento
    {
        #region Variaveis Membro
        private int _idTipoPagamento;
        private string _descricao;
        private int _idTipoDocumento;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdTipoPagamento
        {
            get { return _idTipoPagamento; }
            set { _idTipoPagamento = value; }
        }
        public string Descricao
        {
            get { return _descricao; }
            set { _descricao = value; }
        }
        public int IdTipoDocumento
        {
            get { return _idTipoDocumento; }
            set { _idTipoDocumento = value; }
        }
        #endregion

        #region Construtores
        public TipoPagamento()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public TipoPagamento(int idTipoPagamento)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idTipoPagamento);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idTipoPagamento)
        {
            try
            {
                var consulta = from tp in _context.tab_tipo_pagamento
                               where tp.id_tipo_pagamento == idTipoPagamento
                               select new
                               {
                                   tp.id_tipo_pagamento,
                                   tp.descricao,
                                   tp.tab_tipo_documento.Id_tipo_documento
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idTipoPagamento = list.id_tipo_pagamento;
                    this._descricao = list.descricao;
                    this._idTipoDocumento = list.Id_tipo_documento;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
        {
            if (null == valueSelector)
            {
                throw new
                    ArgumentNullException("valueSelector");
            }
            if (null == values) { throw new ArgumentNullException("values"); }

            ParameterExpression p = valueSelector.Parameters.Single();
            if (!values.Any())
            {
                return e => false;
            }

            var equals = values.Select(value =>
            (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value,
            typeof(TValue))));
            var body = equals.Aggregate<Expression>((accumulate, equal) =>
            Expression.Or(accumulate, equal));
            return Expression.Lambda<Func<TElement, bool>>(body, p);
        }
        #endregion

        #region Metodos Publicos
        public List<TipoPagamento> SelectAll()
        {
            try
            {
                List<TipoPagamento> listTpPagamento = new List<TipoPagamento>();

                var consulta = from tp in _context.tab_tipo_pagamento
                               select new
                               {
                                   tp.id_tipo_pagamento,
                                   tp.descricao,
                                   tp.tab_tipo_documento.Id_tipo_documento
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    TipoPagamento tpPagamento = new TipoPagamento();
                    tpPagamento.IdTipoPagamento = list.id_tipo_pagamento;
                    tpPagamento.Descricao = list.descricao;
                    tpPagamento.IdTipoDocumento = list.Id_tipo_documento;

                    listTpPagamento.Add(tpPagamento);
                }

                return listTpPagamento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<TipoPagamento> SelectPor(int _tipoDocumento, bool _decimoTerceiro)
        {
            try
            {
                List<TipoPagamento> listTipoPagto = new List<TipoPagamento>();

                int[] _codDecTerceiro = { 4, 5 };

                if (_decimoTerceiro)
                {
                    var consulta = from tipopagto in _context.tab_tipo_pagamento.Where((BuildContainsExpression<tab_tipo_pagamento, int>(item => item.id_tipo_pagamento, _codDecTerceiro)))
                                   where tipopagto.tab_tipo_documento.Id_tipo_documento == _tipoDocumento
                                   select new
                                   {
                                       tipopagto.id_tipo_pagamento,
                                       tipopagto.tab_tipo_documento.Id_tipo_documento,
                                       tipopagto.descricao
                                   };

                    var listConsulta = consulta.ToList();

                    foreach (var list in listConsulta)
                    {
                        TipoPagamento tipopagto = new TipoPagamento();
                        tipopagto.IdTipoPagamento = list.id_tipo_pagamento;
                        tipopagto.IdTipoDocumento = list.Id_tipo_documento;
                        tipopagto.Descricao = list.descricao;

                        listTipoPagto.Add(tipopagto);
                    }
                }
                else
                {
                    var decTerceiro = from tipopagto in _context.tab_tipo_pagamento.Where((BuildContainsExpression<tab_tipo_pagamento, int>(item => item.id_tipo_pagamento, _codDecTerceiro)))
                                      select tipopagto;

                    var consulta = from tipopagto in _context.tab_tipo_pagamento.Except(decTerceiro)
                                   where tipopagto.tab_tipo_documento.Id_tipo_documento == _tipoDocumento
                                   select new
                                   {
                                       tipopagto.id_tipo_pagamento,
                                       tipopagto.tab_tipo_documento.Id_tipo_documento,
                                       tipopagto.descricao
                                   };

                    var listConsulta = consulta.ToList();

                    foreach (var list in listConsulta)
                    {
                        TipoPagamento tipopagto = new TipoPagamento();
                        tipopagto.IdTipoPagamento = list.id_tipo_pagamento;
                        tipopagto.IdTipoDocumento = list.Id_tipo_documento;
                        tipopagto.Descricao = list.descricao;

                        listTipoPagto.Add(tipopagto);
                    }
                }

                return listTipoPagto;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<TipoPagamento> SelectParcelasVT(int idTipoDocumento)
        {
            try
            {
                List<TipoPagamento> listTipoPagto = new List<TipoPagamento>();

                var consulta = (from tipopagto in _context.tab_tipo_pagamento
                                where (tipopagto.tab_tipo_documento.Id_tipo_documento == idTipoDocumento)
                                && ((tipopagto.id_tipo_pagamento == 14) ||
                                    (tipopagto.id_tipo_pagamento == 15))
                                select new
                                {
                                    tipopagto.id_tipo_pagamento,
                                    tipopagto.descricao
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    TipoPagamento tipoPagto = new TipoPagamento();
                    tipoPagto.IdTipoPagamento = list.id_tipo_pagamento;
                    tipoPagto.Descricao = list.descricao;

                    listTipoPagto.Add(tipoPagto);
                }

                return listTipoPagto;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion
    }
}
